/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication1;

import Interface.TelaPrincipal;

/**
 *
 * @author Diego
 */
public class Memória {
    private BlocoMemoria[] vet;

    Memória(){
        vet = new BlocoMemoria[256];
    }
    void libera(Processos p){
         for (int i=0; i<vet.length;i++){
            if (vet[i]!=null){
                if(vet[i].getNomeproc().equals(p.getNome())){
                    vet[i]=null;
                }
            }
        }
    }
    void armazena(Processos p){
        int num_bloc = p.getMb()/4;

        if (p.getMb()%4!=0){
            num_bloc++;
        }
        int pos= posiçao(num_bloc);
            for (int j=pos; j<(pos+num_bloc);j++){
                    vet[j]= new BlocoMemoria(p.getNome());
                }
    }
    int posiçao(int num_bloc){

        int cont=0;
        int i =0;
        while ((i<vet.length) & (cont<num_bloc)){
            if(vet[i]==null)
                cont++;
            else{
                cont=0;
            }
            i++;
        }
        return (i-cont);
    }
    void desfragmenta(){
        int indice=0;
        boolean achounulo = false;
        for (int i=0; i<vet.length;i++){
            if(vet[i]==null){
                indice=i;
                achounulo=true;
            }
            if (achounulo){
                for(int k=indice;k<vet.length;k++)
                    if (vet[k]!=null){
                        vet[indice]=vet[k];
                        vet[k]=null;
                        indice++;
                    }
                achounulo=false;
            }
        }
    }

    boolean espaçoLivre(int tamanho) throws Exception{
       int num_bloc = tamanho/4;
        int cont=0;
        if (tamanho%4!=0){
            num_bloc++;
        }
        int i =0;
        while (i<vet.length){
            if(vet[i]==null)
                cont++;
            else{        
                cont=0;
            }
            if (cont>=num_bloc)
                return true;
            i++;
        }
        desfragmenta();
        cont=0;
        i =0;
        while (i<vet.length){
            if(vet[i]==null)
                cont++;
            else{
                cont=0;
            }
            if (cont>=num_bloc)
                return true;
            i++;
        }
        TelaPrincipal.getInstancia().escreverHistorico("Não possui espaço na memória\n");
        return false;
    }
}
